#pragma once

#include <iostream>
#include <random>
#include <chrono>
#include "msli/entities/Reference.hpp"

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 函数声明，返回一个0到1之间的随机数（包含0，不包含1）
double generateRandomNumber() {
    std::random_device rd;
    std::mt19937 gen(rd());
    std::uniform_real_distribution<> dis(0, 1);
    return dis(gen);
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 自定义比较函数，只比较pair的first元素
struct CompareFirst {
    bool operator()(const InterSecVector<Key_TYPE> &a, const InterSecVector<Key_TYPE> &b) {
        return a.oid < b.oid;
    }
};

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 函数用于计算两个集合的交集
std::vector<InterSecVector<Key_TYPE>>
intersection(const std::vector<InterSecVector<Key_TYPE>> &a, const std::vector<InterSecVector<Key_TYPE>> &b) {
    std::vector<InterSecVector<Key_TYPE>> result;
    std::set_intersection(a.begin(), a.end(), b.begin(), b.end(), std::back_inserter(result), CompareFirst());
    return result;
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 函数用于计算多个集合的交集
std::vector<InterSecVector<Key_TYPE>>
multiple_intersection(const std::vector<std::vector<InterSecVector<Key_TYPE>>> &sets) {
    if (sets.empty()) return {};
    std::vector<InterSecVector<Key_TYPE>> result = sets[0];
    for (size_t i = 1; i < sets.size(); ++i) {
        result = intersection(result, sets[i]);
    }
    return result;
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////